package basis.netease.medium;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 7-20 根据数字的补数排序
 * 对整数的二进制表示取反（0 变 1 ，1 变 0）后，再转换为十进制表示，可以得到这个整数的补数。
 * 例如，整数 5 的二进制表示是 "101" （没有前导零位），取反后得到 "010" ，再转回十进制表示得到补数 2 。
 * 给你一个整数数组 arr 。请你将数组中的元素按照其补数升序排序。如果补数相同，则按照原数值大小升序排列。
 * 请你返回排序后的数组。
 * 提示：
 * 1 <= arr.length <= 500
 * 0 <= arr[i] <= 10^4
 * 输入格式:
 * 整数数组arr，以",”分隔字符串的形式作为输入
 * 输出格式:
 * 排好序的整数数组，以",”分隔字符串的形式作为输出
 * 输入样例:
 * 原始数组arr：
 * 5,10,4,2
 * 输出样例:
 * 排序后的arr：
 * 2,5,4,10
 */
public class Main_17 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Integer[] arr = Arrays.stream(scanner.nextLine().split(",")).map(Integer::parseInt).toArray(Integer[]::new);
        Arrays.sort(arr, (a, b) -> {
            int aComplement = getComplement(a);
            int bComplement = getComplement(b);
            if (aComplement != bComplement) {
                return aComplement - bComplement;
            } else {
                return a - b;
            }
        });
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            sb.append(arr[i] + ",");
        }
        System.out.println(sb.substring(0, sb.length() - 1));
    }

    public static int getComplement(int num) {
        String binaryStr = Integer.toBinaryString(num);
        StringBuilder complementStr = new StringBuilder();
        for (char c : binaryStr.toCharArray()) {
            if (c == '0') {
                complementStr.append('1');
            } else {
                complementStr.append('0');
            }
        }
        return Integer.parseInt(complementStr.toString(), 2);
    }

}
